#!/bin/bash
# Online recovery 2nd stage script

set -o xtrace

MAIN_NODE_PGDATA="$1"              # main node dabatase cluster path
DEST_NODE_HOST="$2"                # hostname of the DB node to be recovered
DEST_NODE_PGDATA="$3"              # database cluster path of the DB node to be recovered
MAIN_NODE_PORT="$4"                # main node port number
DEST_NODE_ID="$5"                  # node id of the DB node to be recovered
DEST_NODE_PORT="$6"                # port number of the DB node to be recovered
MAIN_NODE_HOST="$7"                # main node hostname


PGHOME=/usr/pgsql-16
ARCHIVEDIR=/var/lib/pgsql/archivedir  # archive log directory
POSTGRESQL_STARTUP_USER=postgres
SSH_KEY_FILE=id_rsa_pgpool
SSH_OPTIONS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i ~/.ssh/${SSH_KEY_FILE}"

# Force to flush current value of sequences to xlog
${PGHOME}/bin/psql -h $MAIN_NODE_HOST -p $MAIN_NODE_PORT -t -c 'SELECT datname FROM pg_database WHERE NOT datistemplate AND datallowconn' template1|
while read i
do
  if [ "$i" != "" ]; then
    psql -h $MAIN_NODE_HOST -p $MAIN_NODE_PORT -c "SELECT setval(oid, nextval(oid)) FROM pg_class WHERE relkind = 'S'" $i
  fi
done

if [ $? -ne 0 ]; then
    echo ERROR: recovery_2nd_stage: failed.
    exit 1
fi

psql -h $MAIN_NODE_HOST -p $MAIN_NODE_PORT -c "SELECT pgpool_switch_xlog('$ARCHIVEDIR')" template1

if [ $? -ne 0 ]; then
    echo ERROR: recovery_2nd_stage: pgpool_switch_xlog failed.
    exit 1
fi

# start target server as a streaming replication standby server
ssh -T ${SSH_OPTIONS} ${POSTGRESQL_STARTUP_USER}@$DEST_NODE_HOST "
        $PGHOME/bin/pg_ctl -l /dev/null -w -D $DEST_NODE_PGDATA promote
"

if [ $? -ne 0 ]; then
    echo ERROR: recovery_2nd_stage: promote failed.
    exit 1
fi

echo recovery_2nd_stage: end: recovery_2nd_stage is completed successfully 
exit 0
